package com.vates.reservas.service.impl;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.vates.reservas.dominio.Hotel;
import com.vates.reservas.dominio.TipoHabitacion;
import com.vates.reservas.negocio.Disponibilidad;
import com.vates.reservas.service.DisponibilidadService;
import com.vates.reservas.service.HotelService;

@Component(value = "disponibilidadService")
public class DisponibilidadServiceImpl implements DisponibilidadService {

	@Autowired
	HotelService hotelService;
	private EntityManager em = null;

	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.em = em;
	}

	@Override
	public List<Disponibilidad> comprobrarDisponibilidad(long numHotel,
			Date fechaInicio, Date fechaFin) {
		Query consulta = em
				.createQuery("SELECT sum(r.cantidad) FROM Reserva r "
						+ " WHERE r.tipoHabitacion.id = :tipo "
						+ " AND   ((r.fechaInicio BETWEEN :inicio AND :fin) OR "
						+ "        (r.fechaFin BETWEEN :inicio AND :fin) OR "
						+ "        (r.fechaInicio <= :inicio AND r.fechaFin >= :fin)) ");
		Long ocupadas = new Long(0);
		int libres = 0;
		Hotel hotel = hotelService.busquedaPorId(numHotel);
		List<Disponibilidad> listado = new LinkedList<Disponibilidad>();
		for (TipoHabitacion tipo : hotel.getHabitaciones()) {
			consulta.setParameter("tipo", tipo.getId());
			consulta.setParameter("inicio", fechaInicio);
			consulta.setParameter("fin", fechaInicio);
			ocupadas = (Long) consulta.getSingleResult();
			if (ocupadas == null) {
				libres = tipo.getCantidad();
			} else {
				libres = tipo.getCantidad() - ocupadas.intValue();
			}
			listado.add(new Disponibilidad(tipo, libres));
		}
		return listado;
	}

}
